﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Sistema_Totem.Datos.SqlServer;
using System.Collections;
using Sistema_Totem.Logica.Excepciones;

namespace Sistema_Totem.Logica.Clases
{
    public class Rol
    {
        private int id;
        private String tipoRol;
        private String nombre;
        private String descripcion;
        private List<Rol> listaRol;      

        #region Constructores
        /// <summary>
        /// Constructor vacio de la
        /// clase Rol.
        /// </summary>
        public Rol()
        {

        }

        /// <summary>
        /// Constructor de la clase 
        /// para Agregar un Rol.
        /// </summary>
        /// <param name="nombreRol"></param>
        /// <param name="tipo"></param>
        /// <param name="descripcionRol"></param>
        public Rol(string nombreRol, string tipo, string descripcionRol)
        {
            nombre = nombreRol;
            tipoRol = tipo;
            descripcion = descripcionRol;
        }

        /// <summary>
        /// Constructor de la clase que
        /// permite consultar los roles.
        /// </summary>
        /// <param name="tipo"></param>
        /// <param name="descripcionRol"></param>
        public Rol(string tipo, string descripcionRol)
        {
            tipoRol = tipo;
            descripcion = descripcionRol;
        }

        /// <summary>
        /// Constructor de la clase que permite
        /// buscar un Rol por nombre.
        /// </summary>
        /// <param name="nombreRol"></param>
        public Rol(string nombreRol)
        {
            nombre = nombreRol;
        }

        /// <summary>
        /// Constructor de la clase que
        /// permite modificar un rol.
        /// </summary>
        /// <param name="idRol"></param>
        /// <param name="nombreRol"></param>
        /// <param name="tipo"></param>
        /// <param name="descripcionRol"></param>
        public Rol(int idRol, string nombreRol, string tipo, string descripcionRol)
        {
            id = idRol;
            nombre = nombreRol;
            tipoRol = tipo;
            descripcion = descripcionRol;
        }
        #endregion Constructores

        #region Getter and Setter

        /// <summary>
        /// Implementacion del atributo
        /// id de la clase Rol.
        /// </summary>
        public int Id
        {
            get { return id; }
            set { id = value; }
        }

        /// <summary>
        /// Implementacion del atributo
        /// nombre de la clase Rol.
        /// </summary>
        public String Nombre
        {
            get { return nombre; }
            set { nombre = value; }
        }

        /// <summary>
        /// Implementacion del atributo
        /// tipoRol de la clase Rol.
        /// </summary>
        public String TipoRol
        {
            get { return tipoRol; }
            set { tipoRol = value; }
        }

        /// <summary>
        /// Implementacion del atributo
        /// descripcion de la clase Rol.
        /// </summary>
        public String Descripcion
        {
            get { return descripcion; }
            set { descripcion = value; }
        }

        /// <summary>
        /// Implementacion del atributo listaRol
        /// para generar la lista de roles.
        /// </summary>
        public List<Rol> ListaRol
        {
            get { return listaRol; }
            set { listaRol = value; }
        }
        #endregion Getter and Setter

        #region Metodos

        #region Agregar Rol
        /// <summary>
        /// Método que llama Agregar Rol
        /// por parámetro el objeto tipo Rol
        /// </summary>
        /// <param name="rol"></param>
        /// <returns></returns>
        public bool AgregarRol(Rol rol)
        {
            bool verificacion = false;
            
            try
            {
                // Instancia de un objeto de tipo SqlServerRol
                SqlServerRol serverRol = new SqlServerRol();
                // Llamada al metodo AgregarRol pasando por parametro 
                //el objeto del tipo Rol.
                bool retorno = serverRol.AgregarRol(rol);
                // Verificación que retorna la insercion sea de "true".
                verificacion = retorno;
            }
            catch(Exception e)
            {
                throw new RolExcepcion("Error: " + e.Message);
            }
            //Retorna la respuesta de la verificacion de la insercion
            return verificacion;
        }
        #endregion Agregar Rol

        #region Modificar Rol
        /// <summary>
        /// Método que llama a Modificar Rol
        /// por parámeto un objeto de tipo rol.
        /// </summary>
        /// <param name="rol"></param>
        /// <returns></returns>
        public bool ModificarRol(Rol rol)
        {
            bool verificacion = false;

            try
            {
            SqlServerRol serverRol = new SqlServerRol();
            bool retorno = serverRol.ModificarRol(rol);
            //Verificación que retorna la modificación sea "true".
            verificacion = retorno;
            }
            catch(Exception e)
            {
                throw new RolExcepcion("Error: " + e.Message);
            }            
            //Retorna la respuesta de la verificacion de la modificación.
            return verificacion;
        }
        #endregion Modificar Rol

        #region Lista de Roles
        /// <summary>
        /// Método que crea una lista de roles.
        /// </summary>
        /// <returns></returns>
        public List<Rol> ListaRoles()
        {
            SqlServerRol serverRol = new SqlServerRol();
            return serverRol.ListaDeRoles();
        }
        #endregion Lista de Roles

        #region Consultar Roles
        /// <summary>
        /// Método que consulta los valores
        /// de un rol específico.
        /// </summary>
        /// <param name="nombre"></param>
        /// <returns></returns>
        public Rol ConsultarRol(string nombre)
        {
            Rol rol= new Rol();
            Rol resultado = null;
            //Instancia de un objeto tipo SqlServerRol
            SqlServerRol serverRol = new SqlServerRol();
            resultado = serverRol.ConsultarRol(nombre);
            return resultado;
        }
        #endregion Consultar Roles

        #region Consultar Roles Modificar
        /// <summary>
        /// Método que consulta los valores 
        /// de un rol que va a ser modificado.
        /// </summary>
        /// <param name="valor"></param>
        /// <returns></returns>
        public Rol ConsultarRolModificar(int valor)
        {
            Rol rol = new Rol();
            Rol resultado = null;
            //Instancia de un objeto tipo SqlServerRol
            SqlServerRol serverRol = new SqlServerRol();
            resultado = serverRol.ConsultarRolModificar(valor);
            return resultado;
        }
        #endregion Consultar Roles Modificar

        #endregion Metodos
    }
}